package ws.service.database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import ws.service.Produto;

public class ProdutoDAO {
	private Connection connection;
	
// Construtores
	public ProdutoDAO() {
		try {
			this.connection = new ConnectionFactory().getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public ProdutoDAO(Connection connection) {
		this.connection = connection;
	}
	
// Adiciona produto no banco de dados
	public void adiciona(Produto produto) {
		try {
			String sql = "insert into Produto (idProduto, nomeProd, idCategoria, Marca, unidMed, Peso, Altura, Largura, Comprimento, textProd) values (?,?,?,?,?,?,?,?,?,?)";
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			stmt.setString(1, produto.getId());
			stmt.setString(2, produto.getNome());
			stmt.setShort(3, produto.getCategoria());
			stmt.setString(4, produto.getMarca());
			stmt.setString(5, produto.getUnimedida());
			stmt.setFloat(6, produto.getPeso());
			stmt.setFloat(7, produto.getAltura());
			stmt.setFloat(8, produto.getLargura());
			stmt.setFloat(9, produto.getComprimento());
			stmt.setString(10, produto.getTexto());
			
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
// Exclui produto do banco de dados
	public void exclui(Produto produto) {
		String sql = "delete from Produto where idProduto = ?";
		try {
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setString(1, produto.getId());
			stmt.execute();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
// Atualiza produto no banco de dados
	public void atualiza(Produto produto) {
		String sql = "update Produto set nomeProd = ?, idCategoria = ?, Marca = ?, unidMed = ?, Peso = ?, Altura = ?, Largura = ?, Comprimento = ?, textProd = ? where idProduto = ?";
		try {
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			
			stmt.setString(1, produto.getNome());
			stmt.setShort(2, produto.getCategoria());
			stmt.setString(3, produto.getMarca());
			stmt.setString(4, produto.getUnimedida());
			stmt.setFloat(5, produto.getPeso());
			stmt.setFloat(6, produto.getAltura());
			stmt.setFloat(7, produto.getLargura());
			stmt.setFloat(8, produto.getComprimento());
			stmt.setString(9, produto.getTexto());
			stmt.setString(10, produto.getId());
			
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
// Ontem informacoes de um dado produto
	public Produto consulta(String id) {
		String sql = "select * from Produto where idProduto = ?";
		try {
			Produto produto = new Produto();
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			
			stmt.setString(1, id);
			ResultSet rs = stmt.executeQuery();
			
			if (rs.next()) {
				produto.setId(rs.getString("idProduto"));
				produto.setNome(rs.getString("nomeProd"));
				produto.setCategoria(rs.getShort("idCategoria"));
				produto.setMarca(rs.getString("marca"));
				produto.setUnimedida(rs.getString("unidMed"));
				produto.setPeso(rs.getFloat("Peso"));
				produto.setAltura(rs.getFloat("Altura"));
				produto.setLargura(rs.getFloat("Largura"));
				produto.setComprimento(rs.getFloat("Comprimento"));
				produto.setTexto(rs.getString("textProd"));
			}
			rs.close();
			stmt.close();
			
			return produto;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
// Metodo servico informacoes frete produto 	
	public Produto getInfFrete(String id){
		Produto prd = new Produto();
		ProdutoDAO prdDB = new ProdutoDAO();
		
		prd = prdDB.consulta(id);
		prd.setNome(null);
		prd.setCategoria((short)0);
		prd.setMarca(null);
		prd.setUnimedida(null);
		return prd;
	}
	
// Obtem lista completa de produtos
	public Produto[] getLista() {
		String sql = "select * from Produto";
		try {
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			
			rs.last();
			int nRecords = rs.getRow();
			Produto[] produtos = new Produto[nRecords];
			rs.beforeFirst();
			
			int count = 0;
			while(rs.next()) {
				Produto produto = new Produto();
				produto.setId(rs.getString("idProduto"));
				produto.setNome(rs.getString("nomeProd"));
				produto.setCategoria(rs.getShort("idCategoria"));
				produto.setMarca(rs.getString("Marca"));
				produto.setUnimedida(rs.getString("unidMed"));
				produto.setPeso(rs.getFloat("Peso"));
				produto.setAltura(rs.getFloat("Altura"));
				produto.setLargura(rs.getFloat("Largura"));
				produto.setComprimento(rs.getFloat("Comprimento"));
				produto.setTexto(rs.getString("textProd"));
				produtos[count] = produto;
				count++;
			}
			rs.close();
			stmt.close();
			return produtos;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
// Obtem lista de produtos para uma dada categoria
	public Produto[] getSubLista(Short id) {
		String sql = "select * from Produto where idCategoria = ?";
		try {
			PreparedStatement stmt = this.connection.prepareStatement(sql);
			stmt.setShort(1, id);
			ResultSet rs = stmt.executeQuery();
			
			rs.last();
			int nRecords = rs.getRow();
			Produto[] produtos = new Produto[nRecords];
			rs.beforeFirst();
			
			int count = 0;
			while(rs.next()) {
				Produto produto = new Produto();
				produto.setId(rs.getString("idProduto"));
				produto.setNome(rs.getString("nomeProd"));
				produto.setCategoria(rs.getShort("idCategoria"));
				produto.setMarca(rs.getString("Marca"));
				produto.setUnimedida(rs.getString("unidMed"));
				produto.setPeso(rs.getFloat("Peso"));
				produto.setAltura(rs.getFloat("Altura"));
				produto.setLargura(rs.getFloat("Largura"));
				produto.setComprimento(rs.getFloat("Comprimento"));
				produto.setTexto(rs.getString("textProd"));
				produtos[count] = produto;
				count++;
			}
			rs.close();
			stmt.close();
			return produtos;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
// Metodo servico pesquisa produto 
	public Produto[] pesquisa(Short categoria, String nome, String marca) {
		Produto[] produtos, resultado;
		
		if (categoria == null) produtos = new ProdutoDAO().getLista();
		else produtos = new ProdutoDAO().getSubLista(categoria);
		int resArray[] = new int[produtos.length];
		
		int i, count = 0;
		for (i = 0; i < produtos.length; i++) {
			if (nome != null){
				if (produtos[i].getNome().indexOf(nome) >= 0) {
					if(marca != null){
						if (produtos[i].getMarca().indexOf(marca) >= 0) {
							resArray[count] = i;
							count++;
						}
					} else {
						resArray[count] = i;
						count++;
					}
				}
			} else {
				if(marca != null){
					if (produtos[i].getMarca().indexOf(marca) >= 0) {
						resArray[count] = i;
						count++;
					}
				} else {
					resArray[count] = i;
					count++;
				}				
			}
		}
		
		resultado = new Produto[count];
		for (i = 0; i < count; i++) {
			resultado[i] = produtos[resArray[i]];
		}
		
		return resultado;
	}
}
